#include "Int_DZP.h"

static u8 S_Int_DZP_Line_Array[ARRAY_LENGTH];

/**
 * @brief 显示数据数组
 *
 */
u8 picture[PICTURE_LENGTH] = {0};

/**
 * @brief 点阵屏幕显示.回调函数
 *
 */
void Int_DZP_CallBack()
{
    static u8 i = 0;

    // 初始值全灭(阴极管,0=亮,1=灭)
    P0 = 0XFF;
    // 每一毫秒,刷新一下行,并且显示每一个行对应的列数据,列是影响显示数据
    // 595芯片进行赋值
    // 第一个添加1,其他的添加0
    if (i == 0) {
        SER = 1;
    } else {
        SER = 0;
    }

    // 将数据添加到移位寄存器
    SCK = 0;
    SCK = 1;
    // 将数据添加到寄存器(GPIO寄存器,针脚显示和寄存器数据一致)
    RCK = 0;
    RCK = 1;

    // 列数据显示
    P0 = ~S_Int_DZP_Line_Array[i];
    i++;
    if (i == 8) {
        i = 0;
    }
}

/**
 * @brief 向下滚动数据
 *
 */
void Int_DZP_NextLine_CallBack()
{
    static u8 i = 200;
    static u8 j = 0;
    i--;
    if (i == 0) {
        // Int_DZP_AddLine(picture[j]);
        Int_DZP_AddUpLine(picture[j]);
        j++;
        if (j == (PICTURE_LENGTH - 1)) {
            j = 0;
        }
    }
}

/**
 * @brief 初始化点阵屏
 *
 */
void Int_DZP_Init()
{
    // 关闭数码管
    P36 = 1;
    // 关闭LED
    P34 = 0;
    // 设置点阵屏显示
    P35 = 0;

    // 初始化定时器
    Dri_Timer0_Init();
    // 定时器添加回调函数
    Dri_Timer_AddCallBack(Int_DZP_CallBack);
    Dri_Timer_AddCallBack(Int_DZP_NextLine_CallBack);
}

/**
 * @brief 添加点阵屏显示的行数据
 *
 * @param lineArray 点阵屏行显示
 */
void Int_DZP_AddLine_Array(u8 lineArray[8])
{
    u8 i;
    for (i = 0; i < ARRAY_LENGTH; i++) {
        S_Int_DZP_Line_Array[i] = lineArray[i];
    }
}

/**
 * @brief 动态添加单行数据
 *
 * @param line
 */
void Int_DZP_AddLine(u8 line)
{

    // 数组从后面往前面遍历,进行数据覆盖
    u8 i;
    for (i = ARRAY_LENGTH - 1; i > 0; i--) {
        S_Int_DZP_Line_Array[i] = S_Int_DZP_Line_Array[i - 1];
    }

    S_Int_DZP_Line_Array[0] = line;
}

/**
 * @brief 动态添加单行数据
 *
 * @param line
 */
void Int_DZP_AddUpLine(u8 line)
{

    // 数组从后面往前面遍历,进行数据覆盖
    u8 i;
    for (i = 0; i < ARRAY_LENGTH - 1; i++) {
        S_Int_DZP_Line_Array[i] = S_Int_DZP_Line_Array[i + 1];
    }

    S_Int_DZP_Line_Array[ARRAY_LENGTH - 1] = line;
}

/**
 * @brief 动态添加单行数据
 *
 * @param line
 */
void Int_DZP_AddData(u8 array[PICTURE_LENGTH])
{
    u8 i;
    for (i = 0; i < PICTURE_LENGTH; i++) {
        picture[i] = array[i];
    }
}